package com.note.common.context;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 用户上下文
 * 用于在服务中全局获取当前用户信息
 */
public class UserContext {
    
    /**
     * 使用ThreadLocal存储当前请求线程的用户信息
     */
    private static final ThreadLocal<UserInfo> USER_HOLDER = new ThreadLocal<>();
    
    /**
     * 设置当前线程的用户信息
     * @param userInfo 用户信息
     */
    public static void set(UserInfo userInfo) {
        USER_HOLDER.set(userInfo);
    }
    
    /**
     * 设置当前线程的用户信息
     * @param userId 用户ID
     * @param username 用户名
     */
    public static void set(Long userId, String username) {
        USER_HOLDER.set(new UserInfo(userId, username));
    }
    
    /**
     * 获取当前线程的用户信息
     * @return 用户信息，如果未设置则返回null
     */
    public static UserInfo get() {
        return USER_HOLDER.get();
    }
    
    /**
     * 获取当前用户ID
     * @return 用户ID，如果未设置则返回null
     */
    public static Long getUserId() {
        UserInfo userInfo = get();
        return userInfo != null ? userInfo.getUserId() : null;
    }
    
    /**
     * 获取当前用户名
     * @return 用户名，如果未设置则返回null
     */
    public static String getUsername() {
        UserInfo userInfo = get();
        return userInfo != null ? userInfo.getUsername() : null;
    }
    
    /**
     * 清除当前线程的用户信息
     * 通常在请求结束时调用，防止内存泄漏
     */
    public static void clear() {
        USER_HOLDER.remove();
    }
    
    /**
     * 用户信息类
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserInfo {
        /**
         * 用户ID
         */
        private Long userId;
        
        /**
         * 用户名
         */
        private String username;
    }
} 